package com.da.lon.wang.xlg.util;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.view.View;
import android.widget.ImageView;

import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.DisplayImageOptions.Builder;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageLoadingListener;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

/**
 * 图片缓存工具 使用方法：在需要使用图片缓存业务的模块中，注：本工具是单例模式，新的build会覆盖以前的build private
 * ImageCacheUtil imageCache = ImageCacheUtil.getInstance();
 * imageCache.defaultBuild(); //
 * 默认图片加载成功前，中间状态图片；也可以自定义build方式，调用imageCache.build()
 * imageCache.displayImage(); // 显示网络图片，如果存在从本地加载 imageCache.stop(); //
 * 如果退出业务，停止加载图片
 *
 * @author Administrator
 */
public class ImageCacheUtil {
    private static ImageCacheUtil cacheUtil = null;
    private ImageLoader imageLoader = ImageLoader.getInstance();
    private DisplayImageOptions options; // 用于设置图片显示的类

    private ImageCacheUtil() {
    }

    public static ImageCacheUtil getInstance() {
        if (cacheUtil == null)
            cacheUtil = new ImageCacheUtil();
        return cacheUtil;
    }

    /**
     * 设置缓存策略
     */
    public void initCacheStrategy(Context context) {
        ImageLoaderConfiguration configuration_1 = new ImageLoaderConfiguration.Builder(
                context).threadPriority(Thread.NORM_PRIORITY - 2)
                .denyCacheImageMultipleSizesInMemory()
                .discCacheFileNameGenerator(new Md5FileNameGenerator())
                .tasksProcessingOrder(QueueProcessingType.LIFO).build();
        imageLoader.init(configuration_1);
    }

    /**
     * 显示图片 参数1：图片url 参数2：显示图片的控件 参数3：显示图片的设置 参数4：加载图片时监听器; 以实现首次加载图片淡入监听器，调用方式
     * new ImageCacheUtil.AnimateFirstDisplayListener()
     * 开发者也可以自己实现加载图片动画，实现SimpleImageLoadingListener接口
     */
    public void displayImage(String imageUrl, ImageView imageView,
                             ImageLoadingListener imageLoadingListener) {
        try {
            imageLoader.displayImage(imageUrl, imageView, options,
                    imageLoadingListener);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 清除内存缓存
     */
    public void clearMemoryCache() {
        try {
            imageLoader.clearMemoryCache();
            // 清除内存缓存
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }

    /**
     * 清除SD卡中的缓存
     */
    public void clearDiscCache() {
        try {
            imageLoader.clearDiscCache(); // 清除SD卡中的缓存
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }

    }

    /**
     * 清除内存缓存 ,清除SD卡中的缓存
     */
    public void clearMDCache() {
        try {
            imageLoader.clearMemoryCache();
            imageLoader.clearDiscCache();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }

    }

    /**
     * 停止加载图片
     */
    public void stop() {
        try {
            imageLoader.stop();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }

    }

    /**
     * 设置控件加载网络image过程中或失败时显示的预定义图片； 此外，设置本地缓存方式，默认内存、SD卡同时进行缓存
     */
    public void defaultBuild() {
        try {
            options = new DisplayImageOptions.Builder().cacheInMemory() // 设置下载的图片是否缓存在内存中
                    .cacheOnDisc() // 设置下载的图片是否缓存在SD卡中
                    .displayer(new RoundedBitmapDisplayer(1)) // 设置成圆角图片
                    .build();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }

    }

    /**
     * 设置控件加载网络image过程中或失败时显示的预定义图片
     *
     * @param stub           设置图片下载期间显示的图片 ID
     * @param empty          设置图片Uri为空或是错误的时候显示的图片ID
     * @param error          设置图片加载或解码过程中发生错误显示的图片ID
     * @param chacheInMemory 设置下载的图片是否缓存在内存中
     * @param chacheInDisc   设置下载的图片是否缓存在SD卡中
     * @param round          设置成圆角图片，round=0不设置圆角
     */
    public void build(int stub, int empty, int error, boolean chacheInMemory,
                      boolean chacheInDisc, int round) {
        try {
            Builder builder = new DisplayImageOptions.Builder()
                    .showStubImage(stub) // 设置图片下载期间显示的图片
                    .showImageForEmptyUri(empty) // 设置图片Uri为空或是错误的时候显示的图片
                    .showImageOnFail(error); // 设置图片加载或解码过程中发生错误显示的图片
            if (chacheInMemory) {
                builder.cacheInMemory();
            }
            if (chacheInDisc) {
                builder.cacheOnDisc();
            }
            if (round > 0) {
                builder.displayer(new RoundedBitmapDisplayer(round));
            }
            options = builder.build();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }

    }

    public void releaseViewBitmap(View... view) {
        try {
            for (View v : view) {
                if (v != null) {
                    v.setBackgroundResource(0);
                    BitmapDrawable bd = (BitmapDrawable) v.getBackground();
                    if (bd != null) {
                        bd.setCallback(null);
                        bd.getBitmap().recycle();
                    }
                }
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }

    }

    /**
     * 图片加载第一次显示监听器
     *
     * @author Administrator
     */
    public static class AnimateFirstDisplayListener extends
            SimpleImageLoadingListener {

        static final List<String> displayedImages = Collections
                .synchronizedList(new LinkedList<String>());

        @Override
        public void onLoadingComplete(String imageUri, View view,
                                      Bitmap loadedImage) {
            try {
                if (loadedImage != null) {
                    ImageView imageView = (ImageView) view;
                    // 是否第一次显示
                    boolean firstDisplay = !displayedImages.contains(imageUri);
                    if (firstDisplay) {
                        // 图片淡入效果
                        FadeInBitmapDisplayer.animate(imageView, 500);
                        displayedImages.add(imageUri);
                    }
                }
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }

        }
    }
}
